"""
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为：
对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1，那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ；不是，则返回 false 。
输入：n = 19
"""


def is_happy(n: int) -> bool:
    dic = {}
    while True:
        count = add_happy(n)
        if count == 1:
            return True
        elif count in dic:
            return False
        else:
            n = count
            dic[count] = count


def add_happy(int):
    dic = {"0": 0, "1": 1, "2": 4, "3": 9, "4": 16, "5": 25, "6": 36, "7": 49, "8": 64, "9": 81}
    count = 0
    for i in str(int):
        count += dic[i]
    return count


# 标准答案
class Solution:
    def isHappy(self, n: int) -> bool:
        def get_next(n):
            total_sum = 0
            while n > 0:
                n, digit = divmod(n, 10)
                total_sum += digit ** 2
            return total_sum

        seen = set()
        while n != 1 and n not in seen:
            seen.add(n)
            n = get_next(n)

        return n == 1


if __name__ == '__main__':
    print(is_happy(2))
